package medimg.hibernate;
import medimg.scheme.Funkcje;
import medimg.scheme.Pacjenci;
import medimg.scheme.Personel;
import org.hibernate.JDBCException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
/**
 * Dodatkowe metody potrzebne do polaczenia z bazy dana.
 * @author PSI
 */
 public class HibernateUtil {
     /*
      * Main session factory.
      */
    private static SessionFactory sessionFactory;
    private static Configuration sessionConfiguration;
    public static void buildSessionFactory(){
        sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
    }

    /**
     * Połączenie do bazy danych.
     * @param username
     * @param pass
     * @return zwraca funkcje zalogowane, badz null w przypadku pacjenta
     */
    public static int connectToDataBase(java.lang.String username, java.lang.String pass){
        Session session = null;
        boolean bladPersonel = false;
        Pacjenci zalogowanyPacjent = null;
        Funkcje funkcjaZalogowanego = null;
        sessionConfiguration = new Configuration();
        sessionConfiguration.configure();

        sessionConfiguration.setProperty("hibernate.connection.password", pass);
        sessionConfiguration.setProperty("hibernate.connection.username", username);
        try{
            sessionFactory = sessionConfiguration.buildSessionFactory();
            session = sessionFactory.getCurrentSession();
            session.beginTransaction();
            //zalogowanyPersonel = (Personel) session.createQuery("from Personel where pesel="+username).uniqueResult();
            funkcjaZalogowanego = (Funkcje) session.createQuery("from Funkcje where id=(select funkcja from Personel where pesel="+username+")").uniqueResult();
        }

        catch(JDBCException ex)
        {
            System.err.println("Initial SessionFactory creation failed." + ex);
            bladPersonel = true;
            //sessionFactory.close();
        }
        
        if(bladPersonel){
            try{
                sessionFactory = sessionConfiguration.buildSessionFactory();
                session = sessionFactory.getCurrentSession();
                session.beginTransaction();
                zalogowanyPacjent = (Pacjenci) session.createQuery("from Pacjenci where pesel="+username).uniqueResult();
               }

            catch(JDBCException ex)
            {
                System.err.println("Initial SessionFactory creation failed." + ex);
                sessionFactory.close();
            }
        }
        if (funkcjaZalogowanego == null){
            return 0;
        }
        else{
            return funkcjaZalogowanego.getUprawnienia();
        }
        
    }

    /**
     * Rozlaczenie z baza oraz zamkniecie sessionFactory
     */
    public static void disconnectFromDataBase(){
        if(sessionFactory!= null)
        sessionFactory.close();
    }

    /**
     * akcesor dla sessionFactory
     * @return sessionFactory
     */
    public static SessionFactory getSessionFactory(){
        return sessionFactory;

    }

    /**
     * akcesor dla konfiguracji
     * @return sessionConfiguration
     */
    public static Configuration getConfiguration(){
        return sessionConfiguration;
    }

    /**
     * zwraca czy sessionFactory jest otwary
     * @return stan sessionFactory
     */
    public static boolean isOpen(){
        if(sessionFactory!= null)
            return !sessionFactory.isClosed();
        else
            return false;
    }

    /**
     * akcesor dla nazwy zalogowanego usera
     * @return nazwa uzytkownika
     */
    public static java.lang.String getCurrentUser(){
        return sessionConfiguration.getProperty("hibernate.connection.username");
    }
}
